[acpid](http://acpid.sourceforge.net/) es un "demonio" flexible y extensible para entregar [eventos ACPI](/index.php?title=ACPI_modules_(Espa%C3%B1ol)&action=edit&redlink=1 "ACPI modules (Español) (page does not exist)"). Vigila `/proc/acpi/event` y cuando hay un evento, ejecuta programas para manejarlo. Estos eventos se activan mediante ciertas acciones, como:

*   Presionar teclas especiales, incluyendo el botón de Encendido/Hibernar/Suspender.
*   Cerrando la tapa del portátil
*   Desconectar un adaptador de Corriente Alterna a un portátil.
*   Desconectar un jack de un teléfono, etc.

**acpid** puede ser usado así mismo, o combinado con un sistema más robusto como [pm-utils](/index.php?title=Pm-utils_(Espa%C3%B1ol)&action=edit&redlink=1 "Pm-utils (Español) (page does not exist)") y [cpufrequtils](/index.php/CPU_frequency_scaling_(Espa%C3%B1ol) "CPU frequency scaling (Español)") para una mayor solución del control de energía.

**Nota:**

*   [Entornos de escritorio](/index.php/Desktop_environment_(Espa%C3%B1ol) "Desktop environment (Español)"), como [GNOME](/index.php/GNOME_(Espa%C3%B1ol) "GNOME (Español)"), gestor de inicio de sesión de [systemd](/index.php/Systemd_(Espa%C3%B1ol)#ACPI_administraci.C3.B3n_de_la_energ.C3.ADa "Systemd (Español)") y algunos demonios [manejadores de teclas extra](/index.php?title=Extra_Keyboard_Keys_(Espa%C3%B1ol)&action=edit&redlink=1 "Extra Keyboard Keys (Español) (page does not exist)") pueden implementar métodos propios de manejo de eventos, independientemente de acpid. Usar más de un sistema a la vez puede provocar un comportamiento inesperado, como suspenderse dos veces de una, tras apretar una vez el botón de hibernar. Ten esto en cuenta y activa solo manejadores deseados.
*   Ya que por defecto el script que provee acpid, **/etc/acpi/handler.sh**, sobrescribirá la funcionalidad del botón de encendido/apagado de tu entorno de escritorio, seguramente querrás cambiar la rutina de apagado de acpid para evitar apagar el ordenador cuando presiones de golpe el botón de encendido/apagado (ver instrucciones a continuación).

## Contents

*   [1 Instalación](#Instalaci.C3.B3n)
*   [2 Configuración](#Configuraci.C3.B3n)
    *   [2.1 Configuración alternativa](#Configuraci.C3.B3n_alternativa)
*   [3 Trucos y Sugerencias](#Trucos_y_Sugerencias)
    *   [3.1 Ampliando acpid con pm-utils](#Ampliando_acpid_con_pm-utils)
    *   [3.2 Eventos de Ejemplo](#Eventos_de_Ejemplo)
    *   [3.3 Activar el control del volumen](#Activar_el_control_del_volumen)
    *   [3.4 Activar el control del brillo](#Activar_el_control_del_brillo)
    *   [3.5 Habilitar el control del Wi-Fi](#Habilitar_el_control_del_Wi-Fi)
    *   [3.6 Apagar la pantalla del portátil](#Apagar_la_pantalla_del_port.C3.A1til)
    *   [3.7 Sacar el nombre de usuario del monitor actual](#Sacar_el_nombre_de_usuario_del_monitor_actual)
*   [4 Ver también](#Ver_tambi.C3.A9n)

## Instalación

[Instala](/index.php/Help:Reading_(Espa%C3%B1ol)#Instalaci.C3.B3n_de_paquetes "Help:Reading (Español)") el paquete [acpid](https://www.archlinux.org/packages/?name=acpid), disponible en los [repositorios oficiales](/index.php/Official_repositories_(Espa%C3%B1ol) "Official repositories (Español)").

Para que empiece el arranque :

*   Si usas [systemd](/index.php/Systemd "Systemd") (seguramente), ingresa en un terminal `systemctl enable acpid` ;
*   Si usas [initscripts](/index.php/Rc.conf "Rc.conf"), edita `/etc/rc.conf` como superusuario y añade `acpid` a la variable DAEMONS.

## Configuración

[acpid](https://www.archlinux.org/packages/?name=acpid) viene con un número de acciones predefinidas para eventos activos, como lo qué debería occurrir cuando se presiona el botón de encendido/apagado en el ordenador. Por defecto, esas acciones están definidas en `/etc/acpi/handler.sh`, que se ejecuta después de que se detecta un evento ACPI (según determine `/etc/acpi/events/anything`).

Lo siguiente es un ejemplo de una acción. En este caso, cuando se presiona el botón de Hibernar, acpid ejecuta el comando `echo -n mem >/sys/power/state`, que *debería* poner el ordenador en un estado de hibernación (suspendido):

```
button/sleep)
    case "$2" in
        SLPB) echo -n mem >/sys/power/state ;;
	 *)    logger "ACPI action undefined: $2" ;;
    esac
    ;;

```

Desafortunadamente, no todos los ordenadores etiquetan los eventos ACPI de la misma forma. Por ejemplo, el botón Hibernar puede identificarse en un PC como *SLPB* y en otra como *SBTN*.

Para determinar como son reconocidos tus botones o atajos de `teclado`, ejecuta el siguiente comando en un terminal como root:

```
# tail -f /var/log/messages.log

```

Ahora presione el botón de Encendido y/o el botón de Hibernar (p. ej. `Ctrl+Alt+Supr`) de la PC. El resultado debería ser algo asi:

```
logger: ACPI action undefined: PBTN
logger: ACPI action undefined: SBTN

```

Si no funciona, intenta:

```
# acpi_listen

```

Entonces presione el botón de Encendido/Apagado y se verá algo así:

```
power/button PBTN 00000000 00000b31

```

La salida de `acpi_listen` se envía a `/etc/acpi/handler.sh` como parámetros $1, $2 , $3 & $4.. Ejemplo:

```
$1 power/button
$2 PBTN
$3 00000000
$4 00000b31

```

Como se puede observar, el botón de Hibernar en la salida de ejemplo es reconocido como *SBTN*, en lugar de la etiqueta *SLPB* especificada en archivo `/etc/acpi/handler.sh` por defecto. Para hacer que el botón de Hibernar funcione correctamente en el PC, necesitaremos reemplazar *SLPB)* con *SBTN)*.

Usando esto como base, se puede personalizar fácilmente el archivo `/etc/acpi/handler.sh` para ejecutar una variedad de comandos dependiendo de que evento es ejecutado. Mira la sección [#Trucos y Sugerencias](#Trucos_y_Sugerencias) a continuación para otros comandos usados comúnmente.

### Configuración alternativa

Por defecto, todos los eventos ACPI pasan por el script `/etc/acpi/handler.sh`. Esto se debe al conjunto de reglas escritas en `/etc/acpi/events/anything`:

```
# Pass all events to our one handler script
event=.*
action=/etc/acpi/handler.sh %e

```

Aunque esto funciona muy bien como está, algunos usuarios pueden preferir definir reglas de evento y acciones en sus propios scrpits independientes. Lo siguiente es un ejemplo de cómo usar un archivo de evento individual y su correspondiente script de acción:

Como superusuario, crea el archivo siguiente:

 `/etc/acpi/events/sleep-button` 
```
event=button sleep.*
action=/etc/acpi/actions/sleep-button.sh "%e"

```

Ahora crea el siguinte archivo:

 `/etc/acpi/actions/sleep-button.sh` 
```
#!/bin/sh
case "$2" in
    SLPB) echo -n mem >/sys/power/state ;;
    *)    logger "ACPI action undefined: $2" ;;
esac

```

Finalmente, haz el script ejecutable:

```
# chmod +x /etc/acpi/actions/sleep-button.sh

```

Usando este método, es fácil crear los scripts de eventos/acciones individuales que quieras.

## Trucos y Sugerencias

**Sugerencia:** Algunas acciones descritas aquí, como el control del Wi-Fi y del brillo, pueden ser controlados directamente por los drivers. Deberías consultar la documentación de los módulos del kernel correspondientes cuando este sea el caso.

### Ampliando acpid con pm-utils

Aunque [acpid](https://www.archlinux.org/packages/?name=acpid) puede proveer una función de suspendido básica, se podría desear un sistema más robusto. [pm-utils](/index.php?title=Pm-utils_(Espa%C3%B1ol)&action=edit&redlink=1 "Pm-utils (Español) (page does not exist)") provee una estructura muy flexible suspender e hibernar, incluyendo soluciones para hardware y drivers tercos (p. ej. módulos fglrx). pm-utils provee dos scripts, `pm-suspend` y `pm-hibernate`, los cuales pueden ser insertados como eventos en acpid. Para más información lee el wiki [pm-utils](/index.php/Pm-utils "Pm-utils") wiki.

### Eventos de Ejemplo

Los siguientes son ejemplos de eventos que pueden ser usados en el script `/etc/acpi/handler.sh`. Estos ejemplos deberían ser modificados para que se ajusten a el entorno específico, por ejemplo cambiando los nombres de las variables de evento tal y como las interprete `acpi_listen`.

Para bloquear la pantalla con `xscreensaver` cuando se cierra la tapa del portátil intenta:

```
button/lid)
    case $3 in
        close)
            # The lock command need to be run as the user who owns the xscreensaver process and not as root.
            # See: man xscreensaver-command. $xs will have the value of the user owning the process, if any.

            xs=$(ps -C xscreensaver -o user=)
            if test $xs; then su $xs -c "xscreensaver-command -lock"; fi
            ;;

```

Para suspender el sistema y bloquear la pantalla usando `slimlock` cuando la tapa está cerrada:

```
button/lid)
    case $3 in
        close)
            #echo "LID switched!">/dev/tty5
	     /usr/sbin/pm-suspend &
	     DISPLAY=:0.0 su -c - username /usr/bin/slimlock
            ;;

```

Ejecuta `pm-suspend` cuando se presiona el botón de suspensión.

```
button/sleep)
    case "$2" in
        SBTN) 
	     #echo -n mem >/sys/power/state
            /usr/sbin/pm-suspend
            ;;

```

Para ajustar el brillo del portátil según este conectado a la corriente o no (se debería ajustar los números, mira `/sys/class/backlight/acpi_video0/max_brightness`):

```
ac_adapter)
    case "$2" in
        AC*|AD*)
            case "$4" in
                00000000)
                    echo -n 50 > /sys/class/backlight/acpi_video0/brightness
                    ;;
                00000001)
                    echo -n 100 > /sys/class/backlight/acpi_video0/brightness
                    ;;
            esac

```

### Activar el control del volumen

Descubre la identificación de acpi de los botones de volumen (mira a continuación) y sustituye los eventos acpi en los archivos a continuación. Creamos un script para controlar el volumen (asumiendo que se usa una tarjeta de sonido con [ALSA (Español)](/index.php/ALSA_(Espa%C3%B1ol) "ALSA (Español)")):

 `/etc/acpi/handlers/vol` 
```
#!/bin/sh
step=5

case $1 in
  -) amixer set Master $step-;;
  +) amixer set Master $step+;;
esac

```

Y conectalos a nuevos eventos acpi:

 `/etc/acpi/events/vol_d` 
```
event=button/volumedown
action=/etc/acpi/handlers/vol -

```
 `/etc/acpi/events/vol_u` 
```
event=button/volumeup
action=/etc/acpi/handlers/vol +

```

También otro evento para silenciar:

 `/etc/acpi/events/mute` 
```
event=button/mute
action=/usr/bin/amixer set Master toggle

```

### Activar el control del brillo

Parecido al control del volumen, acpid también permite controlar el brillo de la pantalla. Para conseguir esto escribe un script como el siguiente:

 `/etc/acpi/handlers/bl` 
```
#!/bin/sh
bl_dev=/sys/class/backlight/acpi_video0
step=1

case $1 in
  -) echo $((`cat $bl_dev/brightness` - $step)) >$bl_dev/brightness;;
  +) echo $((`cat $bl_dev/brightness` + $step)) >$bl_dev/brightness;;
esac

```

y otra vez, conecta las teclas a eventos ACPI:

 `/etc/acpi/events/bl_d` 
```
event=video/brightnessdown
action=/etc/acpi/handlers/bl -

```
 `/etc/acpi/events/bl_u` 
```
event=video/brightnessup
action=/etc/acpi/handlers/bl +

```

### Habilitar el control del Wi-Fi

También se puede crear un sencillo controlador wireless presionando los botones WLAN. Un ejemplo de evento:

 `/etc/acpi/events/wlan` 
```
event=button/wlan
action=/etc/acpi/handlers/wlan

```

y su script manejador:

 `/etc/acpi/handlers/wlan` 
```
#!/bin/sh
rf=/sys/class/rfkill/rfkill0

case `cat $rf/state` in
  0) echo 1 >$rf/state && systemctl start net-auto-wireless;;
  1) systemctl stop net-auto-wireless && echo 0 >$rf/state;;
esac

```

### Apagar la pantalla del portátil

Adaptado del [de Gentoo](http://www.gentoo-wiki.info/ACPI/Configuration%7CWiki), viene esta pequeña perla. Añade esto al final de `/etc/acpi/actions/lm_lid.sh` o a la sección *button/lid* `/etc/acpi/handler.sh`. Esto apagará la luz de la pantalla cuando la tapa esté cerrada, y la encenderá cuando la tapa se abra.

```
case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
    closed) XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force off ;;
    open)   XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force on  ;;
esac

```

Si se quiere incrementar/disminuir el brillo o algo que dependa de X, se debe especificar el monitor con X y también el archivo MIT magic cookie (via XAUTHORITY). Lo último es una credencial de seguridad que provee acceso de escritura y lectura al servidor X, monitor, y dispositivos de entrada.

Aquí hay otro script que no usa XAUTHORITY sino sudo:

```
case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
    closed) sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force off ;;
    open)   sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force on  ;;
esac

```

Con ciertas combinaciones de [Xorg](/index.php/Xorg_(Espa%C3%B1ol) "Xorg (Español)") y hardware problemático, `xset dpms force off` solo deja en blanco la pantalla dejando la luz encendida. Esto puede ser corregido usando [vbetool](https://www.archlinux.org/packages/?name=vbetool) de los [repositorios oficiales](/index.php/Official_repositories_(Espa%C3%B1ol) "Official repositories (Español)"). Cambia la sección LCD a:

```
case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
    closed) vbetool dpms off ;;
    open)   vbetool dpms on  ;;
esac

```

Si el monitor se apaga solo brevemente y después se enciende, seguramente sea el control de energía que viene con xscreensaver, que entra en conflicto con los ajustes manuales de *dpm'.*

### Sacar el nombre de usuario del monitor actual

Se puede usar la función `getuser` para descubrir el usuario del monitor actual:

```
getuser ()
    {
     export DISPLAY=`echo $DISPLAY | cut -c -2`
     user=`who | grep " $DISPLAY" | awk '{print $1}' | tail -n1`
     export XAUTHORITY=/home/$user/.Xauthority
     eval $1=$user
    }

```

Se puede usar esta función, por ejemplo, cuando se presiona el botón de Encendido/Apagado, y se requiere apagar [KDE](/index.php/KDE_(Espa%C3%B1ol) "KDE (Español)") correctamente:

```
button/power)
    case "$2" in
        PBTN)
            getuser "$user"
            echo $user > /dev/tty5
            su $user -c "dcop ksmserver ksmserver logout 0 2 0"
            ;;
          *) logger "ACPI action undefined $2" ;;
    esac
    ;;

```

En sistemas más nuevos usando systemd, los accesos a X11 no son necesariamente mostrados en `who`, de manera que la función `getuser` no sirve. Una alternativa es usar `loginctl` para obtener la información requerida (p.ej. usando [xuserrun](https://github.com/rephorm/xuserrun).

## Ver también

*   [http://acpid.sourceforge.net/](http://acpid.sourceforge.net/) - página de acpid
*   [Gentoo wiki](http://www.gentoo-wiki.info/ACPI/Configuration)
*   [ACPI hotkeys](/index.php?title=ACPI_hotkeys_(Espa%C3%B1ol)&action=edit&redlink=1 "ACPI hotkeys (Español) (page does not exist)")